let number = 0;
class BasicPlugin {
  // 在构造函数中获取用户给该插件传入的配置
  constructor(options) {}

  // Webpack 会调用 BasicPlugin 实例的 apply 方法给插件实例传入 compiler 对象
  apply(compiler) {
    let MyPlugin = "WebpackLifeCyclePlugin";
    // 1.读取配置的 Entrys，为每个 Entry 实例化一个对应的 EntryPlugin，为后面该 Entry 的递归解析工作做准备。
    //  compiler.hooks.监听事件的名称.tap(插件名称，回调函数)。具体参数的可到官方API文档查看
    compiler.hooks.entryOption.tap(MyPlugin, (context, entry) => {
      console.log("============entry-option" + "============");
    });
    // 2.当依赖的文件发生变化时会触发 watch-run 事件
    // compiler.hooks.监听事件的名称.tap(插件名称，回调函数)。具体参数的可到官方API文档查看
    compiler.hooks.watchRun.tapAsync(MyPlugin, (watching, callback) => {
      console.log("============watch-run" + "============");
      // 这是一个异步事件，要记得调用 callback 通知 Webpack 本次事件监听处理结束。
      callback();
    });
    // 3.第一个编译完成
    compiler.hooks.afterCompile.tap(MyPlugin, (stats) => {
      console.log("============after-compile" + "============");
    });
    // 4.确定好要输出哪些文件，执行文件输出，可以在这里获取和修改输出内容
    compiler.hooks.emit.tapAsync(MyPlugin, (compilation, callback) => {
      console.log("============emit" + "============");
      // 这是一个异步事件，要记得调用 callback 通知 Webpack 本次事件监听处理结束。
      // 如果忘记了调用 callback，Webpack 将一直卡在这里而不会往后执行。
      setTimeout(() => {
        console.log("文件列表", Object.keys(compilation.assets).join(","));
        callback();
      }, 20);
    });
    // 5.完成一次构建任务
    compiler.hooks.done.tap(MyPlugin, (stats) => {
      //   number = number + 1;
      //   if (number > 1) {
      //     debounce();
      //   }
      //   if (obj) {
      //     if (obj.serverFn) {
      //       obj.serverFn.close();
      //       obj.startFn();
      //     }
      //   }
      console.log("============done" + "============");
    });
    // 6.构建失败
    compiler.hooks.failed.tap(MyPlugin, (err) => {
      console.log("============failed" + "============");
    });
    compiler.hooks.entryOption.tap("MyPlugin", (context, entry) => {
      /* ... */
      // console.log(compiler);
    });

    compiler.hooks.emit.tapPromise("HelloAsyncPlugin", (compilation) => {
      return new Promise((resolve, reject) => {
        console.log("异步工作完成……");
        resolve();
      });
    });
  }
}

module.exports = BasicPlugin;
